/**
 *
 * 通用Ajax模块
 *
 * @class Ajax
 * @requires Zepto
 * @description 通用Ajax模块，提供一些基本的Ajax状态处理相关的内容
 * @author shaochunhua
 * @create 2015-02-04
 * @update 2015-02-04
 */

define(function (require, exports, module) {

    // Module dependency
    var $ = require('zepto');

    /**
     * ajaxDialog
     * @type {{show: Function, hide: Function}}
     */
    var ajaxDialog = {

        /**
         * show ajaxDialog
         *
         * @method show
         * @param text dialog中的文字内容
         * @param flag 是否展示loading的gif
         */
        show: function (text, flag) {
            var $el = $('#tnAjaxDialog'),
                $mask = $('#mask'),
                $body,
                $style,
                style,
                tmp;
            if($el.length !== 0 && $mask.length !== 0){
                $el.css('display', 'block');
                $mask.css('display', 'block');
                return
            }

            $body = $('body');
            if($('#style').length === 0){
                style =
                        '#mask{position:fixed;background:#FFF;z-index:20;top:0;bottom:0;left:0;opacity:0.5;right:0;}' +
                        '#tnAjaxDialog{transform:scale(1.5);position:fixed;z-index:50;left:50%;top:50%;border-radius:4px;padding:10px;width:100px;margin-top:-60px;margin-left:-60px;text-align:center;background-color:transparent}' +
                        '.spinner{position:relative;margin:0 auto;width:68px;height:68px;text-align:center;background:-webkit-gradient(radial, 100% 50%, 0, 100% -38%, 100, from(#33bd61), to(rgba(255,255,255,0)));border-radius:100%;-webkit-animation:rotate 2s linear 0s infinite;-moz-animation:rotate 2s linear 0s infinite;animation:rotate 2s linear 0s infinite}' +
                        '.spinner .spinner-inner{position:relative;top:3px;left:3px;width:62px;height:62px;background:#fff;border-radius:100%}' +
                        '.spinner .cutout{position:absolute;top:34px;left:35px;border-right:34px solid #fff;border-bottom:34px solid #fff;-webkit-border-top-left-radius:0px;-webkit-border-top-right-radius:0px;-webkit-border-bottom-right-radius:34px;-webkit-border-bottom-left-radius:0px;width:0em;height:0em;padding:0}' +
                        '.spinner .s-circle{width:3px;height:3px;background:#33bd61;position:absolute;top:33px;right:0;border-radius:3px}' +
                        '.loading-logo{position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-20px;color:#33bd61;font-size:40px;opacity:0.8;line-height:1;}' +
                        '@-webkit-keyframes rotate{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}';
                $style = document.createElement('style');
                $style.id = 'style';
                $style.innerHTML = style;
                document.body.appendChild($style);
            }

            tmp = '<div class="spinner"><div class="spinner-inner"></div><div class="cutout"></div><div class="s-circle"></div></div>' +
            '<div class="loading-logo"><span class="icon-logo"></span></div>';

            $el = $('<div id="tnAjaxDialog">' + tmp + '</div>');
            $mask = $('<div id="mask"></div>');

            $body.append($mask);
            $body.append($el);
        },

        /**
         * hide ajaxDialog
         *
         * @method hide
         */
        hide: function () {
            $('#tnAjaxDialog').css('display', 'none');
            $('#mask').css('display', 'none');
        }
    };

    /**
     * Main
     *
     * @method main
     * @param {Object} options Ajax请求参数
     * @param {String} options.url 请求地址
     * @param {String} options.type 请求类型，默认为GET
     * @param {String} options.dataType 返回数据格式，默认为JSON
     * @param {Object} options.data 请求数据
     * @param {String} options.loadingText 载入时的提示文字
     * @param {String} options.errorText 载入出错时的提示文字
     * @param {Boolean} options.debug 是否为调试模式
     */
    module.exports = function (options) {

        var loadingText = options.loadingText || '';
        var errorText   = options.errorText || '加载失败，请稍后重试';
        var debug = options.debug || false;

        $.ajax({
            url: options.url,
            type: options.type || 'GET',
            dataType: options.dataType || 'json',
            data: options.data || {},
            beforeSend: function () {
                if (options.debug) console.debug('[Ajax] 请求开始');
                ajaxDialog.show(loadingText, true);
            },
            success: function (res) {
                ajaxDialog.hide();

                if (debug) {
                    console.debug('[Ajax] 返回结果：');
                    console.debug(res);
                }

                options.success(res)
            },
            error: function () {
                if (debug) console.debug('[Ajax] 请求错误');
                ajaxDialog.show(errorText, false);

                setTimeout(function () {
                    ajaxDialog.hide();
                }, 1000);
            },
            complete: function () {
                if (debug) console.debug('[Ajax] 请求完成');
            }
        });
    };

});